/**
 * 对于 callback 的进一步优化，返回一个优化过的 callback
 * 主要是对 this 的绑定和参数的约定
 */
function optimizeCallback(func, context, argCounts) {
  if (context === void 0) {
    return func
  }
  argCounts = argCounts == null ? 3 : argCounts

  switch (argCounts) {
    case 1:
      return function (value) {
        return func.call(context, value)
      }

    case 2:
      return function (value, index) {
        return func.call(context, value, index)
      }

    case 3:
      return function (value, index, collection) {
        return func.call(context, value, index, collection)
      }

    case 4:
      return function (accu, value, index, collection) {
        return func.call(context, accu, value, index, collection)
      }
  }

  return function () {
    return func.apply(context, arguments)
  }
}

export default optimizeCallback
